Управление комментариями
========================

Управление комментариями включает обновление, удаление и одобрение комментариев.
Эти операции реализованы как действия класса `CommentController`.


Обновление и удаление комментариев
----------------------------------

Код, сгенерированный утилитой `Gii` для обновления и удаления комментариев,
остается, в основном, неизменным.

Одобрение комментариев
----------------------

Недавно созданные комментарии находятся в статусе ожидающих одобрения и должны быть одобрены, чтобы стать видимыми для гостевого пользователя. Одобрение комментария — это, главным образом, изменение столбца состояния комментария.

Мы создаем метод `actionApprove()` в классе `CommentController` следующим образом,

~~~
[php]
public function actionApprove()
{
	if(Yii::app()->request->isPostRequest)
	{
		$comment=$this->loadModel();
		$comment->approve();
		$this->redirect(array('index'));
	}
	else
		throw new CHttpException(400,'Invalid request...');
}
~~~

Выше, когда действие `approve` вызывается через запрос POST, мы вызываем метод
`approve()`, определенный в модели `Comment`, для изменения статуса. Затем мы
переадресовываем браузер пользователя к странице, отображающей запись, к которой
относится этот комментарий.

Естественно, потребуется создать и сам метод `approve` в модели `Comment`:

~~~
[php]
public function approve()
{
	$this->status=Comment::STATUS_APPROVED;
	$this->update(array('status'));
}
~~~

Здесь мы просто выставляем свойство `status` комментария в `approved` согласно значению соответствующей константы класса `Comment`:

~~~
[php]
class Comment extends CActiveRecord
{
	...

	const STATUS_PENDING=1;
	const STATUS_APPROVED=2;

	..
}
~~~

Затем мы вызываем метод `update()` для того, чтобы сохранить выставленное свойство в БД.

Мы также изменяем метод `actionIndex()` контроллера `CommentController`, чтобы показать
все комментарии и вывести ожидающие одобрения первыми.

~~~
[php]
public function actionIndex()
{
	$dataProvider=new CActiveDataProvider('Comment', array(
		'criteria'=>array(
			'with'=>'post',
			'order'=>'t.status, t.create_time DESC',
		),
	));

	$this->render('index',array(
		'dataProvider'=>$dataProvider,
	));
}
~~~

Стоит отметить, что в коде выше необходимо разрешить конфликт имён столбцов указав, что нам необходимы значения из
основной таблицы `tbl_comment`. Сам конфликт возникает так как и в `tbl_post` и в `tbl_comment` есть столбцы
`status` и `create_time`.

Сделать это можно путём использования псевдонимов таблиц.
Как описано [в руководстве](/doc/guide/ru/database.arr#disambiguating-column-names),
псевдоним главной таблицы реляционного запроса всегда равен `t`. Поэтому, мы
добавляем `t` к полям `status` и `create_time`.

Как и отображение записей, отображение `index` контроллера `CommentController`
использует [CListView] для вывода списка комментариев, который, в свою очередь,
использует `/wwwroot/blog/protected/views/comment/_view.php` для вывода каждого
отдельного комментария. Мы не будем детально рассматривать данный механизм.
Заинтересованные читатели могут изучить соответствующий файл демонстрационного
приложения: `/wwwroot/yii/demos/blog/protected/views/comment/_view.php`.